package org.beikbank.shiro.helloword;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
    	//1、获取 SecurityManager 工厂，此处使用 Ini 配置文件初始化 SecurityManager
    	//IniSecurityManagerFactory默认采用IniRealm
		Factory<org.apache.shiro.mgt.SecurityManager> factory =
		new IniSecurityManagerFactory("classpath:shiro.ini");
		//2、得到 SecurityManager 实例 并绑定给 SecurityUtils
		org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
		SecurityUtils.setSecurityManager(securityManager);
		//3、得到 Subject 及创建用户名/密码身份验证 Token（即用户身份/凭证）
		Subject subject = SecurityUtils.getSubject();
		UsernamePasswordToken token = new UsernamePasswordToken("beikbank", "123456");
		try {
			//4、登录，即身份验证; 其会自动委托给 SecurityManager.login 方法进行登录
			subject.login(token);
		} catch (AuthenticationException e) {
			//5、身份验证失败
			/*
			 * DisabledAccountException（禁用的帐号）
			 * LockedAccountException（锁定的帐号）
			 * UnknownAccountException（错误的帐号）
			 * ExcessiveAttemptsException（登录失败次数过多）
			 * IncorrectCredentialsException （错误的凭证）
			 * ExpiredCredentialsException（过期的凭证）等
			 * */
			System.err.println("验证失败==========>" + e.getMessage());
		}

		System.out.println("是否登录=====>" + subject.isAuthenticated()); //断言用户已经登录
		System.err.println("登录用户=====>" + subject.getPrincipal());
		//6、退出;其会自动委托给 SecurityManager.logout 方法退出
		if(subject.isAuthenticated()){
			subject.logout();
			System.err.println("==========退出登录=====");
		}
		System.err.println("是否登录=====>" + subject.isAuthenticated()); //断言用户已经登录
    }
}
